#pragma once
#include <iostream>
namespace ys
{
	template<typename T>
	class unique_ptr
	{
	private:
		T* _ptr;		// 管理的内存空间

		// 拷贝构造与赋值重载禁用
		unique_ptr(const unique_ptr&) = delete;
		unique_ptr& operator=(const unique_ptr&) = delete;

	public:
		// 构造函数
		unique_ptr(T* ptr = nullptr)
			: _ptr(ptr) {}
		// 析构函数
		~unique_ptr()
		{
			if (_ptr != nullptr)
				delete _ptr;
		}
		//移动语义
		unique_ptr(unique_ptr&& other)
			: _ptr(other._ptr)
		{
			other._ptr = nullptr;
		}
		unique_ptr& operator=(unique_ptr&& other)
		{
			// 判断是否是自我赋值
			if (this != &other)
			{
				// 先释放自己管理的资源
				if (_ptr != nullptr)
					delete _ptr;
				// 资源转移
				_ptr = other._ptr;
				other._ptr = nullptr;
			}
			return *this;
		}
		// 重新赋值管理的资源
		void reset(T* ptr = nullptr)
		{
			// 释放旧资源
			if (_ptr != nullptr)
				delete _ptr;
			// 管理新资源
			_ptr = ptr;
		}

		// 重载函数
		T& operator*() { return *_ptr; }
		T* operator->() { return _ptr; }
		explicit operator bool() const  { return _ptr != nullptr; }
	};
}

struct MyClass
{
	int val1 = 0;
	int val2 = 0;

	MyClass(int x, int y)
		:val1(x), val2(y) {}
};